"use strict";
/*
    布尔类型（boolean）
    数字类型（number）
    字符串类型（string）
    数组类型（array）
    元组类型（tuple）
    枚举类型（enum）
    任意类型（any）
    null和undefined
    void类型:表示没有任何类型，一般用于定义方法的时候，方法没有返回值。
    never类型:其他类型（包括null 和 undefined）的子类型，代表从不会出现的值，这就意味着声明never的变量只能被never类型所赋值。
 */
//布尔类型（boolean） true false
var flag = true;
flag = false;
//数字类型（number）
var a = 123;
a = 12.3;
console.log(a);
//字符串类型（string）
var str = "this is ts";
//数组类型（array） ts中定义数组有两种方式
//es5 var arr = [1,"123",false]
//1、第一种定义方式
var arr1 = [1, 2, 3, 4, 5];
console.log(arr1);
var arr2 = ["php", "js", 'golang'];
console.log(arr2);
//2、第二种定义方式
var arr3 = [11, 22, 33, 44, 55];
console.log(arr3);
var arr4 = ["aaa", "bbb", "ccc"];
//3、第三种方式
var arr5 = ['123', 123, true];
console.log(arr5);
//元组类型（tuple） 属于数组一种
var arr6 = ["aaa", 123, true];
//枚举类型（enum）
var Flag;
(function (Flag) {
    Flag[Flag["success"] = 1] = "success";
    Flag[Flag["error"] = -1] = "error";
})(Flag || (Flag = {}));
var f = Flag.error;
console.log(f);
var Color;
(function (Color) {
    Color[Color["red"] = 0] = "red";
    Color[Color["blue"] = 1] = "blue";
    Color[Color["orange"] = 2] = "orange";
})(Color || (Color = {}));
var c = Color.blue;
console.log(c);
//任意类型（any）
var num1 = 123;
num1 = "str";
num1 = true;
console.log(num1);
//任意类型的用处
var oBox = document.getElementById('box');
oBox.style.color = 'red';
//null 和 其它类型:其它类型的子类型
//1、
//var num2:number;
//console.log(num2)//输出:undefined 报错
//2、
//var num2:undefined;
//console.log(num2)//输出undefined 正确
//3、
var num3;
num3 = 123;
console.log(num3);
//4、定义了没有赋值就是undefined
var num4;
console.log(num4);
//5、
//var num5:null;
//num5 = 123;//报错
//6、一个元素可能是number类型，可能是null，可能是undefined
var num6;
num6 = 123;
console.log(num6);
//void类型
//es5的定义方法
function run1() {
    console.log('run1');
}
run1();
//方法没有返回任何类型
function run2() {
    console.log('run2');
}
run2();
//错误写法
/*function run3():undefined {
    console.log('run3');
}
run3();*/
//正确写法
function run4() {
    return 123;
}
run4();
//never
var aa;
aa = undefined;
var bb;
bb = null;
var cc;
//cc = 123;//错误的写法
cc = (function () {
    throw new Error('错误');
})();
//3.1.函数的定义
//es5定义函数的方法
//函数声明法
/*function run5() {
    return 'run5';
}
//匿名函数
var run6 = function () {
    return 'run6';
}*/
//ts中定义函数的方法
//函数声明法
function run7() {
    return 'run7';
}
//匿名函数
var run8 = function () {
    return 123;
};
run8();
//ts中定义方法传参
function getInfo1(name, age) {
    return '${name}---${age}';
}
alert(getInfo1('jack', 20));
var getInfo2 = function (name, age) {
    return '${name}---${age}';
};
alert(getInfo2('marry', 30));
//没有返回值的方法
function run9() {
    console.log('run9');
}
run9();
//3.2.方法可选参数
//es5里面方法的实参和形参可以不一样，但是ts中必须一样，如果不一样就需要配置可选参数
function getInfo3(name, age) {
    if (age) {
        return '${name}---${age}';
    }
    else {
        return '${name}---年龄保密';
    }
}
alert(getInfo3('jack'));
alert(getInfo3('jack', 30));
//可选参数必须配置到参数的最后面
//3.3.默认参数
//es5里面没法设置默认参数，es6和ts中都可以设置默认参数
function getInfo4(name, age) {
    if (age === void 0) { age = 20; }
    if (age) {
        return '${name}---${age}';
    }
    else {
        return '${name}---年龄保密';
    }
}
alert(getInfo4('jack'));
alert(getInfo4('jack', 30));
//3.4.剩余参数
function sum1(a, b, c, d) {
    return a + b + c + d;
}
alert(sum1(1, 2, 3, 4));
//三点运算法，接收实参传递过来的值
//写法一
function sum2() {
    var result = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        result[_i] = arguments[_i];
    }
    var sum = 0;
    for (var i = 0; i < result.length; i++) {
        sum += result[i];
    }
    return sum;
}
alert(sum2(1, 2, 3, 4, 5, 6, 7, 8, 9));
//写法二
function sum3(a, b) {
    var result = [];
    for (var _i = 2; _i < arguments.length; _i++) {
        result[_i - 2] = arguments[_i];
    }
    var sum = a * 10 + b * 10;
    for (var i = 0; i < result.length; i++) {
        sum += result[i];
    }
    return sum;
}
alert(sum3(1, 2, 3, 4, 5, 6, 7, 8, 9));
function getInfo5(str) {
    if (typeof str === 'string') {
        return '我叫:' + str;
    }
    else {
        return '我的年龄是:' + str;
    }
}
alert(getInfo5('jack')); //正确
alert(getInfo5(123)); //正确
function getInfo6(name, age) {
    if (age) {
        return '我叫:' + name + '我的年龄是:' + age;
    }
    else {
        return '我叫:' + name;
    }
}
alert(getInfo6('jack', 20));
alert(getInfo6('marry'));
//alert(getInfo6(30));//错误写法
//3.6.箭头函数  es6
//this指向的问题     箭头函数里面this指向上下文
setTimeout(function () {
    alert('run');
}, 1000);
setTimeout(function () {
    alert('run');
}, 1000);
